﻿using System;
using System.Collections.Generic;
using System.Text;
using PSE.ProcessManager.Common.Gateway;
using PSE.ProcessManager.Common.Process;
using Sinacor.Infra.Core.ProcessManager.Client;

namespace Sinacor.Process.Bovespa.MensagensAlocacao.Client
{
    /// <summary>
    /// Gerencia a geração e transmissão de mensagens de alocação a central depositária
    /// </summary>
    [Serializable]
    public class MensagensAlocacao : SinacorBaseProcessClient
    {
        #region Eventos

        /// <summary>
        /// Evento disparado ao receber dados sobre a execução do processo
        /// </summary>
        public event EventHandler<ProcessEventArgs<ProcessEntity.InformacoesProcesso>> InformacoesProcessoRecebidas;

        #endregion

        #region Construtor

        public MensagensAlocacao()
        {
            this.Id = ProcessEntity.Catalog.MensagensAlocacao.ProcessID;
        }
        		 
	    #endregion        

        #region Métodos

        /// <summary>
        /// Executa o processo de geração e transmissão de mensagens de alocação
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(ProcessEntity.DadosExecucao parameter)
        {
            Message<ProcessEntity.DadosExecucao> message = new Message<ProcessEntity.DadosExecucao>();
            message.MessageId = ProcessEntity.Catalog.MensagensAlocacao.Executar.MessageID;
            message.ProcessId = ProcessEntity.Catalog.MensagensAlocacao.ProcessID;
            message.Parameter = parameter;
            message.Operation = ProcessEntity.Catalog.MensagensAlocacao.Executar.Operation;
            message.From = ProcessEntity.Catalog.MensagensAlocacao.Executar.Operation;
            this.BeginSendMessage(message);
        }

        /// <summary>
        /// OnMessageReceived
        /// </summary>
        /// <param name="message">BaseMessage</param>
        protected void OnMessageReceived(BaseMessage message)
        {
            if (message.MessageId == ProcessEntity.Catalog.MensagensAlocacao.Executar.MessageID &&
                InformacoesProcessoRecebidas != null)
            {
                InformacoesProcessoRecebidas(this, new ProcessEventArgs<ProcessEntity.InformacoesProcesso>(message.RetrieveParameter<ProcessEntity.InformacoesProcesso>()));
            }

            base.OnMessageReceived(message);
        }

        #endregion
    }
}